package com.wn.sms.service.impl;

import cn.hutool.core.util.RandomUtil;
import com.wn.sms.config.SmsTemplate;
import com.wn.sms.service.ISmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.time.Duration;

/**
 * @author yellow Docter
 * @date 2024-09-04
 * @desc 蜗牛创想：www.woniuxy.com
 *
 */
@Service
public class SmsServiceImpl implements ISmsService {

//    private RedisTemplate redisTemplate;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private SmsTemplate smsTemplate;

    /**
     *  01  RedisTemplate 这个是 StringRedisTemplate 的父类
     *  02  RedisTemplate 中 存储的是 obj
     *  02  StringRedisTemplate 中 存储的是 String
     *        如果是 简单的字符串 StringRedisTemplate 复杂的数据类型 redisTemplate
     */
    @Override
    public String getCode(String phone) {

        //01 拿到code
        String code = RandomUtil.randomNumbers(4);
        System.out.println("code = " + code);

        //限流  (进行抽取 自定义注解 + AOP + redis 进行 封装  可以再很多地方使用)

        //统计 短时间内 计数 发送短信的次数 防止短信轰炸
        String keyCount = "SMS:" + phone + ":count";
        String count = stringRedisTemplate.opsForValue().get(keyCount);
        if (count == null){
            //第一次发送短信
            stringRedisTemplate.opsForValue().set(
                    keyCount,
                    "1",
                    Duration.ofMinutes(20)     //ttl 2min
            );
        }
        if (count != null && Integer.parseInt(count) > 3){
            return "发送短信太频繁,请稍后再尝试";
        }

        //02 给redis 存储code

        String keyCode = "SMS:" + phone;
        String redisCode = stringRedisTemplate.opsForValue().get(keyCode);
        if(StringUtils.hasText(redisCode) && count != null &&  Integer.parseInt(count) > 3){ //判断字符串不为null
            return "验证码未过期、不要重复获取验证码";
        }
        //存储2min中
        stringRedisTemplate.opsForValue().set(
                keyCode,
                code,
                Duration.ofMinutes(20)     //ttl 2min
        );
        //统计 发送了一次验证码
        stringRedisTemplate.opsForValue().increment(keyCount);

        //03 给 阿里云发送code
//        smsTemplate.sendSms(phone,code);

        return code;
    }


}
